import axios from 'axios'
import store from '@/store'
import { Message } from 'view-design';
import i18n from "@/locale";
// import { Spin } from 'iview'
const addErrorLog = errorInfo => {
  const { statusText, status, request: { responseURL } } = errorInfo
  let info = {
    type: 'ajax',
    code: status,
    mes: statusText,
    url: responseURL
  }
  if (!responseURL.includes('save_error_logger')) store.dispatch('addErrorLog', info)
}

class HttpRequest {
  constructor (baseUrl = baseURL) {
    this.baseUrl = baseUrl
    this.queue = {}
  }
  getInsideConfig () {
    const config = {
      baseURL: this.baseUrl,
      headers: {
        //
      }
    }
    return config
  }
  destroy (url) {
    delete this.queue[url]
    if (!Object.keys(this.queue).length) {
      // Spin.hide()
    }
  }
  interceptors (instance, url,loading) {
    // 请求拦截
    let loadingMsg = null;
    instance.interceptors.request.use(config => {
      // 添加全局的loading...
      if (!!loading){
        //开启正加载条
        loadingMsg = Message.loading({content: i18n.t('wait_dispose_message'),duration: 10});
      }
      if (!Object.keys(this.queue).length) {
        // Spin.show() // 不建议开启，因为界面不友好
      }
      this.queue[url] = true
      return config
    }, error => {
      if (!!loading && !!loadingMsg){
        setTimeout(loadingMsg, 100); //关闭正加载条
      }
      return Promise.reject(error)
    })
    // 响应拦截
    instance.interceptors.response.use(res => {
      if (!!loading && !!loadingMsg){
        setTimeout(loadingMsg, 100); //关闭正加载条
      }

      this.destroy(url)
      const { data, status } = res
/*      console.log(res);
      console.log(data);*/
      //console.log(">>>> axios.interceptors: window.relogin=",window.relogin);
      //console.log(">>>> axios.interceptors: data=",data);
      if (!data){
        Message.error(i18n.t('msg_120002'));
        if (!!window.relogin)
          window.relogin();
        return { data, status };
      }else if (data.code == 120002){ //认证失败，重新登录
        //alert("认证失败，重新登录");
        Message.error(i18n.t('msg_120002'));
        console.log(">>>> axios.interceptors: 认证失败，重新登录");
        /** 网上说可以在这直接调 window  的方法，在main/components/user/user.vue 定义*/
        if (!!window.relogin)
          window.relogin();
        return { data, status };
      }if (data.code == 120012){ //登录信息已失效，重新登录
        //alert("登录信息已失效，重新登录");
        Message.error(i18n.t('msg_120012'));
        console.log(">>>> axios.interceptors: 登录信息已失效，重新登录");
        /** 网上说可以在这直接调 window  的方法，在main/components/user/user.vue 定义*/

        if (!!window.relogin)
          window.relogin();
        return { data, status };
      }else if (data.code == 120003){
        Message.error(i18n.t('msg_120003'));
        //alert("权限不足，不能访问此接口");
        return { data, status };
      }else{
        return { data, status };
      }
    }, error => {
      this.destroy(url)
      let errorInfo = error.response
      if (!errorInfo) {
        const { request: { statusText, status }, config } = JSON.parse(JSON.stringify(error))
        errorInfo = {
          statusText,
          status,
          request: { responseURL: config.url }
        }
      }
      // 这个有问题，暂不加
      //addErrorLog(errorInfo)
      return Promise.reject(error)
    })
  }

  /**
   *
   * @param options
   * @param loading 加载条， true 显示， false or null 不显示
   * @returns {*}
   */
  request (options,loading) {
    const instance = axios.create(
      //20231225 百度说这样可以忽略 自签证书的拦截，没有浏览器地址输入，浏览器也弹不出来，直接就拒绝访问了
/*      {
        httpsAgent: new https.Agent({
          rejectUnauthorized: false, // 忽略 SSL 证书验证
        }),
      }*/
    )
    options = Object.assign(this.getInsideConfig(), options)
    this.interceptors(instance, options.url,loading)
    return instance(options)
  }
}
export default HttpRequest
